/******************************************************************
 * 文件：TLink.c
 * 功能：实现TLink云平台的TCP连接相关函数
 * 日期：2018-04-11
 * 作者：zx
 * 版本：Ver.1.0 | 最初版本
 * 
 * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "stdio.h"
#include "string.h"
#include "TLink.h"
#include "NetWork.h"
#include "RELAY/Relay.h"
#include "DELAY/Delay.h"
extern u8 RXBuffer[RXBUFFER_LEN];
extern DeviceSta_Strcture device;
/**
 * 功能：连接TLink云平台
 * 参数：None
 * 返回值：非0表示连接成功,0表示失败
 */
u8 connectTlink(void)
{
    u8 sta = 0;

    sta = connectServer(TCP, TLINK_IP, TLINK_PORT); //连接服务器

    if (sta != 0)
    {
        printf("\r\nTLinked TLink!");
        sendBuffertoServer(APP_ID); //发送注册序号
    }
    else
    {
        printf("\r\nLink fail!");
    }

    return sta;
}

/**
 * 功能：发送设备状态(传感器数据以及继电器状态)
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 */
void sendDeviceStatus(DeviceSta_Strcture *pdevsta)
{
    static u8 m = 0;
    char buffer[25] = {0};

    /* m用于在烟雾浓度过高或者监测到火焰时只进一次 */
    if ((device.occur == 1 || device.Concentration >= 15) && m == 0)
    {
        Delay_ms(200);
        if ((device.occur == 1 || device.Concentration >= 15) && m == 0)
        {
            m++;
            pdevsta->Beep = 1;         //蜂鸣器低电平工作
            setRelay(Light, Light_ON); //蜂鸣器低电平触发，高电平不工作
        }
    }
    else if ((device.occur != 1 || device.Concentration < 15) && m != 0)
    {
        m = 0;
        // pdevsta->Beep = 0;          //蜂鸣器高电平不工作
        // setRelay(Light, Light_OFF); //蜂鸣器低电平触发，高电平不工作
        // if (device.occur != 1)      //如果监测到的确是由于火焰消除进来的
        // {
        //     device.occur = 0; //清火焰标志
        // }
    }
    else
    {
    }

    /*格式化数据帧*/
    sprintf(buffer, "FM:%d,%d,%d,%d.#", pdevsta->Humidity, pdevsta->Temperature, pdevsta->Concentration, pdevsta->Beep);

    /*发送数据到TLink服务器*/
    sendBuffertoServer(buffer);
}

/**
 * 功能：处理从服务器接收的控制数据
 * 参数：pdevsta 设备参数结构体指针
 * 返回值：None
 * 说明：该函数应该被串口空闲中断调用,已达到最佳实时性能
 */
void processDeviceStatus(DeviceSta_Strcture *pdevsta)
{
    u8 i = 0;

    /*掉线重连*/
    if ((u8)strstr(RXBuffer, "CLOSE"))
    {
        printf("\r\nDisconnected!");
        connectTlink();
        memset(RXBuffer, 0, RXBUFFER_LEN);
        return;
    }

    /*对应状态控制*/
    if ((u8)strstr(RXBuffer, "RELAY1_ON"))
    {
        i = 1;
        pdevsta->Relay1 = 1;
        setRelay(RELAY1, RELAY_CLOSE);
    }
    else if ((u8)strstr(RXBuffer, "RELAY1_OFF"))
    {
        i = 1;
        pdevsta->Relay1 = 0;
        setRelay(RELAY1, RELAY_OPEN);
    }

    if ((u8)strstr(RXBuffer, "RELAY2_ON"))
    {
        i = 1;
        pdevsta->Relay2 = 1;
        setRelay(RELAY2, RELAY_CLOSE);
    }
    else if ((u8)strstr(RXBuffer, "RELAY2_OFF"))
    {
        i = 1;
        pdevsta->Relay2 = 0;
        setRelay(RELAY2, RELAY_OPEN);
    }

    if ((u8)strstr(RXBuffer, "Light_ON"))
    {
        i = 1;
        pdevsta->Beep = 1;
        setRelay(Light, Light_ON); //蜂鸣器低电平蜂鸣
    }
    else if ((u8)strstr(RXBuffer, "Light_OFF"))
    {
        i = 1;
        device.occur = 0;
        pdevsta->Beep = 0;
        setRelay(Light, Light_OFF); //red led高电平关闭
    }

    /*清除接收缓冲并更新继电器状态到服务器*/
    if (i != 0)
    {
        printf("RXBuffer is %s.", RXBuffer);
        memset(RXBuffer, 0, RXBUFFER_LEN);
        sendDeviceStatus(pdevsta);
        Delay_ms(200);
    }
}
